/***************************************************************************************************
*Copyright(C),2010-2016,Sumscope
*FileName	:  HTMessage.h
*Author	:  scofined.qi
*Version	:  1.0
*Date		:  2016/08/21
*Desc		:  //用于主要说明此程序文件完成的主要功能
*Relation :
*Others	:  //其他内容说明
*Function :  //主要函数列表，每条记录应包含函数名及功能简要说明
*History	:  //修改历史记录列表，每条修改记录应包含修改日期、修改者及修改内容简介
***************************************************************************************************/
#pragma once

#include "TableUser.h"
#include <core/time/time.h>
#include <core/strings/BaseString.h>

namespace qb{
	namespace ht{
		////////////////////////////////////////////////////////////////////////////////
		struct SourcePos{					// 用于跟踪位置,便于调试
			const char*			m_file;		// 文件名称
			int					m_line;		// 代码行号
		};
		struct ReceiverKey{					// 
            void*				m_window;	// 收取消息的窗口
			void*				m_component;// m_window的组件
		};
		enum kHTableMessage{				//D:data thread  U:ui thread
			kHTableMessageDataChanged,		//D->U	有新的记录更新/添加/删除/
			kHTableMessageSortChanged,		//U->D	界面的排序列发生了变化
			kHTableMessageSortFinished,		//D->U	全部重新排序完毕
			kHTableMessageFilterChanged,	//U->D	筛选条件发生了变化
			kHTableMessageFilterApplied,	//D->U	筛选条件已经应用
			kHTableMessageUserAdded,		//U->D	有新的用户TableUser添加进来了
			kHTableMessageUserRemoved		//U->D	用户TableUser不再被UI所使用
		};
		struct tHTableMessageBasic{
			SourcePos				m_trackinfo;		// 源代码位置跟踪信息
			HTUserId				m_userid;			// 全局唯一,标识一个TableUser
            qb::base::BaseString	m_username;			// 只用于调试
            qb::base::HighResTime	m_request_time;		// 请求时间,部分事件是请求响应的
            qb::base::HighResTime	m_start_time;		// 发送时间
		};
		struct tHTableMessageUserAdded :public tHTableMessageBasic{		// kHTableMessageUserAdded
			/*
			需要哪些信息?
			1.每个列的信息
			2.初始化排序信息
			3.初始化过滤器信息
			4.__FILE__,__LINE__:用于追踪调试
			5.id,name:ui线程分配,name用于调试,实际上使用id,唯一,全局递增
			6.UI线程接收地址信息:窗口句柄,对象指针
			*/
			TableDesc		m_desc;				// 列描述信息
			TableUser*		m_user;				// 准备好的user信息,包括各种过滤器等等
            qb::base::BaseString		m_table_name;		// 全局唯一,表名称,如果相同,那么则共享
			ReceiverKey		m_receiver_info;	// 接收者信息,使得UI可以收到反馈消息
		};
		struct tHTableMessageUserRemoved :public tHTableMessageBasic{
			/*
			5.id,name:ui线程分配,name用于调试,实际上使用id,唯一,全局递增
			*/
		};
		struct tHTableMessageDataChanged :public tHTableMessageBasic{//D->U
			/*
			数据线程每次更新记录后,会往以id为key的queue中投递记录变更信息
			然后给UI线程发送此消息
			UI线程收到此消息,将id对应的queue取最新一个消息,然后决定是否要刷新界面
			需要哪些信息?
			1.id,name:据此ui线程可从一个共用的队列中找出该id所收集到的多个更新信息
			2.记录总量是否变化
			3.是否需要刷新:视口
			4.哪些记录发生了变化(可选:哪些字段变化了)
			*/
		};
		struct tHTableMessageSortChanged :public tHTableMessageBasic{//U->D
			/*
			用户更改了列排序,
			vector<kColumn>
			vector<bool ascend>
			变更原因:是否是将一个已派序列倒排
			*/
			GridColumnSet	m_grid_columns;		// 
		};
		struct tHTableMessageSortFinished :public tHTableMessageBasic{//D->U
			/*
			后台线程全部重排完毕,
			视口如果超限,会相应调节,但基本上保持不变
			*/

		};
		struct tHTableMessageFilterChanged{//U->D
			/*
			// 过滤条件发生了变化
			// 后台线程收到此消息
			// 条件是弱化还是强化还是切换
			// 如果条件强化,那么只需对已过滤后的数据,按照强化条件再筛一遍
			// 如果条件弱化,那么要对未过滤的数据,按照弱化条件再筛一遍
			// 如果是切换,那么要清空数据,对全部数据按照新的条件再筛一遍
			// 该消息,会触发D->U的若干个tHTableMessageFilterFinished

			需要哪些信息?
			1.时间,用于测量从开始过滤到过滤完毕所需要的时间
			2.过滤id:每次过滤器变化都递增
			3.真实的过滤器信息
			4.过滤器变化信息:弱化,强化,切换(用于加快过滤速度)
			*/
		};

		struct tHTableMessageFilterApplied{
			/*
			// 筛选条件完毕,视口将重置,即显示最前面若干条记录
			//
			需要哪些信息?
			1.过滤器开始变更时间,用于测量响应时间
			2.进度信息:以支持界面上快速显示最开头的一屏记录
			如当前遍历到BondContainer的那个下标了
			已经收集到多少条记录通过过滤器了
			3.过滤id:
			*/
		};

	}//namespace ht
}//namespace qb
